package com.kexio.enterprise.observability.logging.annotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * 操作日志注解
 * 
 * 用于标记需要记录操作日志的方法
 * 
 * 使用示例：
 * <pre>
 * &#64;OperateLog(module = "用户管理", operation = "创建用户")
 * public User createUser(User user) {
 *     // 创建用户逻辑
 * }
 * 
 * &#64;OperateLog(
 *     module = "订单管理", 
 *     operation = "更新订单状态",
 *     detail = "订单ID: #{orderId}, 状态: #{status}",
 *     level = LogLevel.INFO
 * )
 * public void updateOrderStatus(Long orderId, String status) {
 *     // 更新订单状态
 * }
 * </pre>
 * 
 * @author Kexio
 * @since 1.0.0
 */
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface OperateLog {

    /**
     * 操作模块
     */
    String module();

    /**
     * 操作名称
     */
    String operation();

    /**
     * 操作详情
     * 支持SpEL表达式，如: "用户ID: #{userId}"
     */
    String detail() default "";

    /**
     * 日志级别
     */
    LogLevel level() default LogLevel.INFO;

    /**
     * 是否记录请求参数
     */
    boolean includeArgs() default true;

    /**
     * 是否记录返回结果
     */
    boolean includeResult() default false;

    /**
     * 是否记录异常信息
     */
    boolean includeException() default true;

    /**
     * 是否记录执行时间
     */
    boolean includeExecutionTime() default true;

    /**
     * 是否异步记录日志
     */
    boolean async() default true;

    /**
     * 操作类型
     */
    OperationType type() default OperationType.OTHER;

    /**
     * 业务标识
     * 用于关联业务数据，如订单ID、用户ID等
     */
    String businessKey() default "";

    /**
     * 标签
     * 用于日志分类和过滤
     */
    String[] tags() default {};

    /**
     * 条件表达式
     * 满足条件时才记录日志，支持SpEL表达式
     */
    String condition() default "";

    /**
     * 失败时是否记录日志
     */
    boolean logOnFailure() default true;

    /**
     * 成功时是否记录日志
     */
    boolean logOnSuccess() default true;

    /**
     * 日志级别枚举
     */
    enum LogLevel {
        TRACE, DEBUG, INFO, WARN, ERROR
    }

    /**
     * 操作类型枚举
     */
    enum OperationType {
        /**
         * 查询操作
         */
        QUERY,
        
        /**
         * 新增操作
         */
        CREATE,
        
        /**
         * 更新操作
         */
        UPDATE,
        
        /**
         * 删除操作
         */
        DELETE,
        
        /**
         * 导入操作
         */
        IMPORT,
        
        /**
         * 导出操作
         */
        EXPORT,
        
        /**
         * 登录操作
         */
        LOGIN,
        
        /**
         * 登出操作
         */
        LOGOUT,
        
        /**
         * 权限操作
         */
        PERMISSION,
        
        /**
         * 配置操作
         */
        CONFIG,
        
        /**
         * 其他操作
         */
        OTHER
    }
}
